home *** CD-ROM | disk | FTP | other *** search
- Subject: v07i057: 2.11 News Source, Part08/09
- Newsgroups: mod.sources
- Approved: mirror!rs
-
- Submitted by: seismo!rick (Rick Adams)
- Mod.sources: Volume 7, Issue 57
- Archive-name: 2.11news/Part08
-
- # To extract, sh this file
- # news 2.11 source part 8 of 9
- if test ! -d src
- then
- mkdir src
- fi
- echo x - src/Makefile.dst 1>&2
- sed 's/.//' >src/Makefile.dst <<'*-*-END-of-src/Makefile.dst-*-*'
- -# '@(#)Makefile.dst 1.17 10/29/86'
- -# Generic Makefile.
- -# This is converted to USG/v7/etc by localize.sh
- -# which should at least be a copy of localize.v7 or localize.usg
- -
- -# definitions
- -
- -#V7 OSTYPE = v7
- -#USG OSTYPE = usg
- -
- -# HOME is the user name whose home dir has all the news stuff in it.
- -HOME= exptools
- -# Use the -DHOME line if you want dynamic lookup in /etc/passwd
- -#HOMENAME= -DHOME=\"$(HOME)\"
- -HOMENAME=
- -
- -NEWSUSR = news
- -NEWSGRP = news
- -SPOOLDIR = /usr/spool/news
- -BATCHDIR = /usr/spool/batch
- -LIBDIR = /usr/lib/news
- -BINDIR = /usr/bin
- -DESTDIR =
- -UUXFLAGS = -r -z
- -
- -LNRNEWS = ln
- -#VMS LNRNEWS = cp # No links in Eunice
- -DEBUG =
- -SCCSID = -DSCCSID
- -DEFS = -DRNEWS=\"$(BINDIR)/rnews\" -DSPOOLDIR=\"$(SPOOLDIR)\" \
- - -DBATCHDIR=\"$(BATCHDIR)\" -DLIBDIR=\"$(LIBDIR)\" \
- - -DBINDIR=\"$(BINDIR)\" -DNEWSUSR=\"$(NEWSUSR)\" \
- - -DNEWSGRP=\"$(NEWSGRP)\"
- -
- -# Order is important here
- -INSCOMPRESS=
- -#BSD4_3 INSCOMPRESS= rm -f $(DESTDIR)$(LIBDIR)/compress; ln -s /usr/ucb/compress $(DESTDIR)$(LIBDIR)/compress
- -COMPRESS= compress
- -#BSD4_3 COMPRESS=
- -
- -#USG VFORK=-Dvfork=fork
- -#V7 VFORK=-Dvfork=fork
- -
- -#BSD4_1 VFORK=
- -#BSD4_2 VFORK=
- -#BSD4_3 VFORK=
- -
- -#USG IBMFLAGS =
- -#USG CFLAGS = ${DEBUG} -O $(IBMFLAGS) -DUSG -Dindex=strchr -Drindex=strrchr ${DEFS} ${SCCSID} ${VFORK}
- -#USG LFLAGS = ${DEBUG} -s -i $(IBMFLAGS)
- -#USG LIBS =
- -#USG LINTFLAGS = ${DEFS}
- -#V7 CFLAGS = ${DEBUG} -O -DDBM ${DEFS} ${SCCSID} ${VFORK}
- -#V7 LFLAGS = ${DEBUG}
- -#V7 LIBS = -ldbm
- -#V7 LINTFLAGS = -chba -DDBM ${DEFS}
- -#BSD4_1 LIBS = -ldbm -ljobs
- -
- -TERMLIB = -ltermlib
- -
- -#VMS TERMLIB = -ltrmlib
- -#VMS LIBS = -ldbm
- -#VMS CFLAGS = ${DEBUG} -O -DDBM ${DEFS} -DVMS ${SCCSID} ${VFORK}
- -#VMS MISC = uname.o
- -#VMS LINTFLAGS = -chba -DDBM -DVMS ${DEFS}
- -#VMS VFORK=
- -
- -#V7 MISC = uname.o
- -#USG MISC = ftime.o
- -OBJECTS = funcs.o funcs2.o getdate.o header.o ndir.o $(MISC)
- -IOBJECTS = inews.o ifuncs.o iextern.o control.o fullname.o \
- - ipathinit.o $(OBJECTS)
- -
- -POBJECTS = postnews.o rextern.o rpathinit.o funcs.o $(MISC)
- -ROBJECTS = readnews.o rfuncs.o rfuncs2.o rextern.o readr.o \
- - process.o rpathinit.o digest.o $(OBJECTS)
- -VOBJECTS = readnews.o rfuncs.o rfuncs2.o rextern.o process.o rpathinit.o \
- - $(OBJECTS) visual.o virtterm.o
- -EXPOBJS = expire.o header.o funcs.o getdate.o iextern.o epathinit.o \
- - funcs2.o ndir.o $(MISC)
- -
- -SRCS = funcs.c funcs2.c header.c
- -ISRCS = inews.c ifuncs.c iextern.c control.c fullname.c $(SRCS)
- -PSRCS = postnews.c rextern.c funcs.c
- -RSRCS = readnews.c rfuncs.c rfuncs2.c rextern.c readr.c process.c \
- - digest.c $(SRCS)
- -VSRCS = readnews.c rfuncs.c rfuncs2.c rextern.c process.c $(SRCS) \
- - visual.c virtterm.c
- -ESRCS = expire.c header.c funcs.c iextern.c \
- - funcs2.c
- -OSRCS = uurec.c recnews.c sendnews.c batch.c unbatch.c caesar.c \
- - recmail.c compress.c
- -
- -UTILS = inews uurec recnews sendnews expire batch unbatch caesar recmail \
- - encode decode $(COMPRESS)
- -SCRIPTS = sendbatch rmgroup checkgroups
- -OTHERS = $(UTILS) $(SCRIPTS)
- -COMMANDS = readnews checknews postnews vnews
- -
- -# dependencies
- -all: $(COMMANDS) $(OTHERS)
- -
- -install: all help vnews.help
- - -mkdir $(DESTDIR)$(BINDIR)
- - -mkdir $(DESTDIR)$(LIBDIR)
- - cp $(COMMANDS) $(DESTDIR)$(BINDIR)
- - -cd $(DESTDIR)$(BINDIR); \
- - strip $(COMMANDS); \
- - chown $(NEWSUSR) $(COMMANDS); \
- - chgrp $(NEWSGRP) $(COMMANDS); \
- - chmod 755 $(COMMANDS)
- - cp help vnews.help $(OTHERS) $(DESTDIR)$(LIBDIR)
- - cd $(DESTDIR)$(LIBDIR); \
- - strip $(UTILS); \
- - chown $(NEWSUSR) $(OTHERS); \
- - chgrp $(NEWSGRP) $(OTHERS); \
- - chmod 755 $(OTHERS)
- - -rm -f $(DESTDIR)$(BINDIR)/rnews $(DESTDIR)$(BINDIR)/inews
- - ${LNRNEWS} $(DESTDIR)$(LIBDIR)/inews $(DESTDIR)$(BINDIR)/rnews
- - chown $(NEWSUSR) $(DESTDIR)$(LIBDIR)/inews
- - chgrp $(NEWSGRP) $(DESTDIR)$(LIBDIR)/inews
- - chmod 6755 $(DESTDIR)$(LIBDIR)/inews $(DESTDIR)$(BINDIR)/rnews
- - $(INSCOMPRESS)
- -#VMS vms -v @euninstal
- -
- -defs.h: defs.dist localize.sh Makefile.dst Makefile
- - sh localize.sh
- -
- -Makefile: localize.sh defs.dist Makefile.dst
- - sh localize.sh
- -
- -update: install.sh makeactive.sh
- - sh install.sh $(SPOOLDIR) $(LIBDIR) $(BINDIR) $(NEWSUSR) $(NEWSGRP) $(OSTYPE)
- - chmod 6755 $(LIBDIR)/inews
- -
- -clean:
- - rm -f $(COMMANDS) $(OTHERS) *.o a.out
- - rm -f core index errs getdate.c
- -
- -lint: ilint vlint rlint elint plint olint
- -ilint: defs.h params.h iparams.h header.h $(ISRCS) pathinit.c
- - lint $(LINTFLAGS) $(ISRCS) -DINEW pathinit.c
- -vlint: defs.h params.h rparams.h header.h $(VSRCS) pathinit.c
- - lint $(LINTFLAGS) $(VSRCS) -DREAD pathinit.c
- -rlint: defs.h params.h rparams.h header.h $(RSRCS) pathinit.c
- - lint $(LINTFLAGS) $(RSRCS) -DREAD pathinit.c
- -elint: defs.h params.h iparams.h header.h $(ESRCS) pathinit.c
- - lint $(LINTFLAGS) $(ESRCS) -DEXP pathinit.c
- -plint: defs.h params.h iparams.h header.h $(PSRCS) pathinit.c
- - lint $(LINTFLAGS) $(PSRCS) -DREAD pathinit.c
- -
- -olint: defs.h params.h iparams.h header.h $(OSRCS)
- - for i in $(OSRCS); do lint $(LINTFLAGS) $$i; done
- -
- -inews: $(IOBJECTS)
- - $(CC) $(LFLAGS) $(IOBJECTS) -o inews $(LIBS) #NOTVMS
- -#VMS vms link/notrace inews.o,ifuncs.o,iextern.o,control.o, \
- -#VMS fullname.o,ipathinit.o,funcs.o,funcs2.o,getdate.o,header.o, \
- -#VMS ndir.o,uname.o,lib:libdbm/lib,lib:libc/lib/exe=inews.
- -
- -readnews: $(ROBJECTS)
- - $(CC) $(LFLAGS) $(ROBJECTS) -o readnews $(LIBS)
- -#VMS mv readnews.exe readnews
- -
- -funcs.o: funcs.c params.h defs.h header.h Makefile
- - $(CC) $(CFLAGS) -c funcs.c
- -
- -funcs2.o: funcs2.c params.h defs.h header.h Makefile
- - $(CC) $(CFLAGS) -c funcs2.c
- -
- -getdate.o: getdate.y
- - @echo "expect 8 shift/reduce conflicts"
- - yacc getdate.y
- - mv y.tab.c getdate.c
- - $(CC) $(CFLAGS) -c getdate.c
- - -rm -f getdate.c
- -
- -inews.o: inews.c iparams.h defs.h params.h header.h Makefile
- - $(CC) $(CFLAGS) -c inews.c
- -
- -ifuncs.o: ifuncs.c iparams.h defs.h params.h header.h Makefile
- - $(CC) $(CFLAGS) $(HOMENAME) -c ifuncs.c
- -
- -iextern.o: iextern.c iparams.h defs.h params.h Makefile header.h
- - $(CC) $(CFLAGS) -c iextern.c
- -
- -postnews: $(POBJECTS)
- - $(CC) $(CFLAGS) $(LFLAGS) $(POBJECTS) -o postnews
- -#VMS mv postnews.exe postnews
- -
- -postnews.o: postnews.c defs.h params.h header.h Makefile
- - $(CC) $(CFLAGS) -c postnews.c
- -
- -readnews.o: readnews.c rparams.h defs.h params.h header.h Makefile
- - $(CC) $(CFLAGS) $(HOMENAME) -c readnews.c
- -
- -rfuncs.o: rfuncs.c rparams.h defs.h params.h header.h Makefile
- - $(CC) $(CFLAGS) -c rfuncs.c
- -
- -rfuncs2.o: rfuncs2.c rparams.h defs.h params.h header.h Makefile
- - $(CC) $(CFLAGS) -c rfuncs2.c
- -
- -rextern.o: rextern.c rparams.h defs.h params.h Makefile header.h
- - $(CC) $(CFLAGS) -c rextern.c
- -
- -readr.o: readr.c rparams.h defs.h params.h Makefile ndir.h header.h
- - $(CC) $(CFLAGS) -c readr.c
- -
- -checknews.o: checknews.c defs.h header.h Makefile params.h
- - $(CC) $(CFLAGS) -c checknews.c
- -
- -vnews: $(VOBJECTS)
- - $(CC) $(LFLAGS) $(VOBJECTS) $(TERMLIB) $(LIBS) -o $@
- -#VMS mv vnews.exe vnews
- -
- -visual.o: visual.c rparams.h defs.h params.h ndir.h header.h Makefile
- - $(CC) $(CFLAGS) -c visual.c
- -
- -control.o: control.c defs.h iparams.h params.h header.h Makefile
- - $(CC) $(CFLAGS) -c control.c
- -
- -logdir.o: logdir.c Makefile
- - $(CC) $(CFLAGS) -c logdir.c
- -
- -uname.o: uname.c defs.h params.h header.h Makefile
- - $(CC) $(CFLAGS) -c uname.c
- -
- -ndir.o: ndir.c ndir.h
- - $(CC) $(CFLAGS) -c ndir.c
- -
- -uurec: uurec.c defs.h Makefile
- - $(CC) $(CFLAGS) $(LFLAGS) uurec.c -o uurec
- -#VMS mv uurec.exe uurec
- -
- -recnews: recnews.c defs.h header.h Makefile
- - $(CC) $(CFLAGS) $(LFLAGS) recnews.c -o recnews
- -#VMS mv recnews.exe recnews
- -
- -sendnews: sendnews.o uname.o
- - $(CC) $(LFLAGS) sendnews.o uname.o -o sendnews
- -#VMS mv sendnews.exe sendnews
- -
- -batch: batch.c Makefile
- - $(CC) $(CFLAGS) $(LFLAGS) batch.c -o batch
- -#VMS mv batch.exe batch
- -
- -unbatch: unbatch.c Makefile
- - $(CC) $(CFLAGS) $(LFLAGS) unbatch.c -o unbatch
- -#VMS mv unbatch.exe unbatch
- -
- -encode: encode.c
- - $(CC) $(CFLAGS) $(LFLAGS) encode.c -o encode
- -#VMS mv encode.exe encode
- -
- -decode: decode.c
- - $(CC) $(CFLAGS) $(LFLAGS) decode.c -o decode
- -#VMS mv decode.exe decode
- -
- -caesar: caesar.c Makefile
- - $(CC) $(CFLAGS) $(LFLAGS) caesar.c -o caesar -lm
- -#VMS mv caesar.exe caesar
- -
- -compress: compress.c
- - $(CC) $(CFLAGS) $(LFLAGS) -o compress compress.c
- -#VMS mv compress.exe compress
- -
- -recmail: recmail.c defs.h params.h header.h
- - $(CC) $(CFLAGS) $(LFLAGS) recmail.c -o recmail
- -#VMS mv recmail.exe recmail
- -
- -process.o: process.c rparams.h defs.h params.h header.h Makefile
- - $(CC) $(CFLAGS) -c process.c
- -
- -checknews: checknews.o process.o cpathinit.o
- - $(CC) $(LFLAGS) checknews.o process.o cpathinit.o -o checknews
- -#VMS mv checknews.exe checknews
- -
- -sendbatch: sendbatch.sh Makefile
- - sed -e "s%LIBDIR%$(LIBDIR)%g" \
- - -e "s%UUXFLAGS%$(UUXFLAGS)%g" \
- - -e "s%BATCHDIR%$(BATCHDIR)%g" sendbatch.sh > sendbatch
- -#VMS /etc/unixtovms sendbatch
- -
- -rmgroup: rmgroup.sh Makefile
- - sed -e "s%LIBDIR%$(LIBDIR)%g" \
- - -e "s%SPOOLDIR%$(SPOOLDIR)%g" rmgroup.sh > rmgroup
- -#VMS /etc/unixtovms rmgroup
- -
- -checkgroups: checkgroups.sh Makefile
- - sed -e "s%LIBDIR%$(LIBDIR)%g" checkgroups.sh > checkgroups
- -#VMS /etc/unixtovms checkgroups
- -
- -sendnews.o: sendnews.c defs.h
- - $(CC) $(CFLAGS) -c sendnews.c
- -
- -fullname.o: defs.h params.h header.h Makefile
- - $(CC) $(CFLAGS) -c fullname.c
- -
- -expire: $(EXPOBJS)
- - $(CC) $(LFLAGS) -o expire $(EXPOBJS) $(LIBS)
- -#VMS mv expire.exe expire
- -
- -header.o: header.c header.h defs.h params.h Makefile
- - $(CC) $(CFLAGS) -c header.c
- -
- -expire.o: expire.c defs.h Makefile params.h ndir.h header.h Makefile
- - $(CC) $(CFLAGS) -c expire.c
- -
- -digest.o: digest.c Makefile
- - $(CC) $(CFLAGS) -c digest.c
- -
- -# Some silliness here to get pathinit for both readnews & inews
- -rpathinit.o: pathinit.c rparams.h header.h params.h defs.h Makefile
- - $(CC) $(CFLAGS) $(HOMENAME) -DREAD -c pathinit.c
- - mv pathinit.o rpathinit.o
- -
- -ipathinit.o: pathinit.c iparams.h header.h params.h defs.h Makefile
- - $(CC) $(CFLAGS) $(HOMENAME) -DINEW -c pathinit.c
- - mv pathinit.o ipathinit.o
- -
- -cpathinit.o: pathinit.c iparams.h header.h params.h defs.h Makefile
- - $(CC) $(CFLAGS) $(HOMENAME) -DCHKN -c pathinit.c
- - mv pathinit.o cpathinit.o
- -
- -epathinit.o: pathinit.c iparams.h header.h params.h defs.h Makefile
- - $(CC) $(CFLAGS) $(HOMENAME) -DEXP -c pathinit.c
- - mv pathinit.o epathinit.o
- -
- -tags: /tmp
- - ctags -w *.h *.c
- -
- -$(LIBDIR):
- - mkdir $(LIBDIR)
- - chmod 755 $(LIBDIR)
- - chown $(NEWSUSR) $(LIBDIR)
- - chgrp $(NEWSGRP) $(LIBDIR)
- -
- -$(BINDIR):
- - mkdir $(BINDIR)
- - chmod 755 $(BINDIR)
- - chown $(NEWSUSR) $(BINDIR)
- - chgrp $(NEWSGRP) $(BINDIR)
- *-*-END-of-src/Makefile.dst-*-*
- echo x - src/digest.c 1>&2
- sed 's/.//' >src/digest.c <<'*-*-END-of-src/digest.c-*-*'
- -/*
- - * digest - process ARPANET digests
- - *
- - * digest(ifile, ofile, header)
- - * FILE *ifile, *ofile;
- - * struct header *header;
- - *
- - * returns: TRUE EOF reached, exit from readnews.
- - * FALSE normal exit, continue reading news.
- - */
- -
- -#ifdef SCCSID
- -static char *SccsId = "@(#)digest.c 1.7 9/19/86";
- -#endif /* SCCSID */
- -
- -#include "rparams.h"
- -
- -struct art {
- - long a_hdr;
- - long a_bod;
- - int a_blen;
- - int a_hlen;
- -};
- -
- -#define loop for(;;)
- -#define getnum(p, n) for (n=0; *p>='0' && *p<='9'; p++) n = n*10 + *p-'0'
- -#define errchk(p) if (*p) goto badopt
- -
- -#define MAXART 128
- -
- -struct art *arts;
- -int lastart;
- -
- -digest(ifp, ofp, h)
- -FILE *ifp, *ofp;
- -struct hbuf *h;
- -{
- - register int n, curart;
- - struct art artbuf[MAXART];
- - int printh, eod, nomore;
- - char cbuf[BUFLEN], *cmd;
- -
- - arts = artbuf;
- - printh = TRUE;
- - nomore = eod = FALSE;
- - curart = 1;
- -
- - if (dscan(ifp))
- - return FALSE;
- -
- - dprint(0, ifp, ofp);
- -
- - loop {
- - if (nomore) break;
- - if (curart < 1) {
- - curart = 1;
- - eod = nomore = FALSE;
- - }
- - if (curart > lastart) curart = lastart;
- - if (eod) nomore = TRUE;
- - if (printh && !nomore)
- - (void) dhprint(curart, ifp, ofp);
- - getcmd:
- - loop {
- - SigTrap = FALSE;
- - fprintf(ofp, "Digest article %d of %d ", curart, lastart);
- - if (curart==lastart && nomore)
- - fprintf(ofp, "Last digest article ");
- - fprintf(ofp, "(%d lines) More? [%s] ",
- - arts[curart].a_blen, nomore?"snq":"ynq");
- - (void) fflush(ofp);
- - cmd = cbuf;
- - if (fgets(cmd, BUFLEN, stdin))
- - break;
- - if (!SigTrap)
- - return(TRUE);
- - putc('\n', ofp);
- - }
- - (void) nstrip(cmd);
- - while (*cmd==' ' || *cmd=='\t')
- - cmd++;
- - printh = TRUE;
- -
- - switch (*cmd++) {
- - case '#':
- - fprintf(ofp, "%d articles in digest\n", lastart);
- - (void) fflush(ofp);
- - printh = FALSE;
- - break;
- -
- - case '$':
- - curart = lastart;
- - break;
- -
- - case '!':
- - fwait(fsubr(ushell, cmd, (char *)NULL));
- - fprintf(ofp, "!\n");
- - printh = FALSE;
- - break;
- -
- - case '\0':
- - if (nomore) {
- - putc('\n', ofp);
- - return(FALSE);
- - }
- - cmd--;
- - case 'y':
- - case 'p':
- - errchk(cmd);
- - dprint(curart++, ifp, ofp);
- - if (curart > lastart)
- - eod = TRUE;
- - break;
- -
- - case 'n':
- - errchk(cmd);
- - if (++curart > lastart) {
- - putc('\n', ofp);
- - return(FALSE);
- - }
- - break;
- -
- - case '+':
- - getnum(cmd, n);
- - errchk(cmd);
- - if (nomore) {
- - putc('\n', ofp);
- - return(FALSE);
- - }
- - if (n) curart += n;
- - else {
- - curart += 1;
- - if (curart > lastart)
- - eod = TRUE;
- - }
- - break;
- -
- - case '-':
- - getnum(cmd, n);
- - errchk(cmd);
- - eod = nomore = FALSE;
- - curart -= (n) ? n : 1;
- - break;
- -
- - case '0': case '1': case '2': case '3': case '4':
- - case '5': case '6': case '7': case '8': case '9':
- - cmd--;
- - getnum(cmd, n);
- - errchk(cmd);
- - curart = n;
- - eod = nomore = FALSE;
- - break;
- -
- - case 'q':
- - case 'x':
- - putc('\n', ofp);
- - return(FALSE);
- -
- - case '?':
- - fprintf(ofp, "\nDigester options:\n\n");
- - fprintf(ofp, "y\tyes, print article.\n");
- - fprintf(ofp, "n\tno, go to next article.\n");
- - fprintf(ofp, "q\texit from digester.\n");
- - fprintf(ofp, "h\tprint article header.\n");
- - fprintf(ofp, "s file\tsave article in file.\n");
- - fprintf(ofp, "t\ttable of contents.\n");
- - fprintf(ofp, "+[n]\tforward n articles (1).\n");
- - fprintf(ofp, "-[n]\tback n articles (1).\n");
- - fprintf(ofp, "\nh and s may be followed by '-'\n");
- - (void) fflush(ofp);
- - break;
- -
- - case 'h':
- - n = curart;
- - if (*cmd=='-') {
- - cmd++;
- - if (n > 1) n--;
- - }
- - errchk(cmd);
- - (void) dhprint(n, ifp, ofp);
- - nomore = printh = FALSE;
- - if (n!=curart)
- - putc('\n', ofp);
- - break;
- -
- - case 's':
- - case 'w':
- - n = curart;
- - if (*cmd=='-') {
- - cmd++;
- - if (n > 1) n--;
- - }
- - while (*cmd==' ' || *cmd=='\t')
- - cmd++;
- - dsaveart(n, ifp, ofp, cmd);
- - nomore = printh = FALSE;
- - if (n!=curart)
- - putc('\n', ofp);
- - break;
- -
- - case 'H':
- - errchk(cmd);
- - hprint(h, ofp, 1);
- - eod = nomore = FALSE;
- - break;
- -
- - case 'T':
- - case 't':
- - errchk(cmd);
- - if (cmd[-1]=='T')
- - hprint(h, ofp, 0);
- - dprint(0, ifp, ofp);
- - eod = nomore = FALSE;
- - break;
- -
- - default:
- - badopt:
- - if (!nomore)
- - fprintf(ofp, "y (yes), n (no), ");
- - fprintf(ofp, "q (quit), s file (save), h (header), t (table of contents)\n");
- - fprintf(ofp, "? for help\n");
- - goto getcmd;
- - }
- - }
- - putc('\n', ofp);
- - return(FALSE);
- -}
- -
- -dscan(ifp)
- -register FILE *ifp;
- -{
- - char scanbuf[BUFLEN];
- - register int n, len;
- - register char *s;
- - register long pos;
- - short wasblank, ishead;
- -
- - n = len = 0;
- - wasblank = FALSE;
- - s = scanbuf;
- - arts[0].a_bod = arts[1].a_hdr = ftell(ifp);
- - arts[0].a_hdr = 0L;
- - arts[1].a_bod = -1L;
- -
- - loop {
- - if (SigTrap)
- - return(TRUE);
- - pos = ftell(ifp);
- - if (fgets(s, BUFLEN, ifp)==NULL)
- - *s = '\0';
- - if (wasblank && isheader(s)) {
- - long lastpos;
- - short is_blank;
- - short nhlines;
- - arts[n++].a_blen = len;
- - len = 0;
- - nhlines = 0;
- - arts[n].a_hdr = pos;
- - is_blank = FALSE;
- - ishead = TRUE;
- - do {
- - lastpos = pos;
- - wasblank = is_blank;
- - nhlines++;
- - pos = ftell(ifp);
- - if (fgets(s, BUFLEN, ifp)==NULL)
- - *s = '\0';
- - else
- - len++;
- - is_blank = (*s=='\n') ? TRUE : FALSE;
- - if (is_blank && nhlines==1)
- - /* one liner--not a header */
- - break;
- - if (!ishead || (s[0] != ' ' && s[0] != '\t'))
- - ishead = isheader(s);
- - } while ((is_blank && !wasblank) || ishead);
- - if ((!is_blank && !wasblank) || nhlines < 2) {
- - /* oops! not a header... back off */
- - arts[n].a_hdr = arts[n-1].a_bod;
- - len += arts[--n].a_blen;
- - } else {
- - if (wasblank)
- - pos = lastpos;
- - arts[n].a_hlen = len;
- - arts[n].a_bod = arts[n+1].a_hdr = pos;
- - arts[n+1].a_bod = -1L;
- - arts[n+1].a_hlen = 3; /* average header len */
- - len = 0;
- - }
- - }
- - if (*s=='\0')
- - break;
- - wasblank = (*s=='\n') ? TRUE : FALSE;
- - len++;
- - }
- - arts[n].a_blen = len;
- - arts[n+1].a_hdr = pos;
- - lastart = n;
- - return FALSE;
- -}
- -
- -dhprint(art, ifp, ofp)
- -register int art;
- -register FILE *ifp, *ofp;
- -{
- - register char c;
- - register long pos = arts[art].a_hdr;
- - register long epos = arts[art].a_bod;
- - register int nlines = 1;
- -
- - putc('\n', ofp);
- - fseek(ifp, pos, 0);
- - while (pos++ < epos && !SigTrap) {
- - if ((c = getc(ifp))=='\n')
- - nlines++;
- - putc(c, ofp);
- - }
- - (void) fflush(ofp);
- - SigTrap = FALSE;
- - return nlines;
- -}
- -
- -dprint(art, ifp, ofp)
- -int art;
- -FILE *ifp, *ofp;
- -{
- -#ifdef PAGE
- - register int cnt;
- - FILE *pfp, *popen();
- -
- - if (art && arts[art].a_blen > 23-arts[art+1].a_hlen && *PAGER) {
- - if (!index(PAGER, FMETA)) {
- - if ((pfp = popen(PAGER, "w"))==NULL)
- - (void) dprinta(art, ifp, ofp);
- - else {
- - cnt = dprinta(art, ifp, pfp) % 23;
- - if (cnt > 23-arts[art+1].a_hlen)
- - while (cnt++ < 24)
- - putc('\n', pfp);
- - (void) pclose(pfp);
- - }
- - } else
- - pout(ofp);
- - } else
- -#endif /* PAGE */
- - (void) dprinta(art, ifp, ofp);
- -}
- -
- -dprinta(art, ifp, ofp)
- -int art;
- -register FILE *ifp, *ofp;
- -{
- - register char c;
- - register long pos = arts[art].a_bod;
- - register long epos = arts[art+1].a_hdr;
- - register int nlines = 0;
- -
- - (void) fseek(ifp, pos, 0);
- - while (pos++ < epos && !SigTrap) {
- - if ((c = getc(ifp))=='\n')
- - nlines++;
- - putc(c, ofp);
- - }
- - (void) fflush(ofp);
- - SigTrap = FALSE;
- - return nlines;
- -}
- -
- -dsaveart(art, ifp, ofp, name)
- -int art;
- -register FILE *ifp, *ofp;
- -register char *name;
- -{
- - register FILE *nfp;
- - char fname[BUFLEN];
- - char *strcat(), *strcpy(), *getenv();
- - register char *nb;
- -
- - while (*name==' ' || *name=='\t')
- - name++;
- -
- - if (*name=='|') {
- - fprintf(ofp, "don't know how to pipe yet.\n");
- - (void) fflush(ofp);
- - return;
- - } else if (*name=='/')
- - (void) strcpy(fname, name);
- - else {
- - if (nb = getenv("NEWSBOX"))
- - (void) strcpy(fname, nb);
- - else
- - (void) strcpy(fname, userhome);
- - (void) strcat(fname, "/");
- - (void) strcat(fname, name);
- - }
- -
- - fprintf(ofp, "Save digest article %d in \"%s\"", art, fname);
- - (void) fflush(ofp);
- - if ((nfp = fopen(fname, "a"))!=NULL) {
- - int ln;
- - ln = dhprint(art, ifp, nfp);
- - ln += dprinta(art, ifp, nfp);
- - fprintf(ofp, " [Appended] %d lines\n", ln);
- - (void) fclose(nfp);
- - } else
- - fprintf(ofp, " cannot append to.\n");
- -}
- -
- -isheader(s)
- -register char *s;
- -{
- - if (isupper(*s) || islower(*s)) {
- - while (*s && *s!=':' && !isspace(*s))
- - s++;
- - if (*s==':' && *++s==' ')
- - return TRUE;
- - }
- - return FALSE;
- -}
- *-*-END-of-src/digest.c-*-*
- echo x - src/readnews.c 1>&2
- sed 's/.//' >src/readnews.c <<'*-*-END-of-src/readnews.c-*-*'
- -/*
- - * readnews - read news articles.
- - */
- -
- -#ifdef SCCSID
- -static char *SccsId = "@(#)readnews.c 2.31 9/16/86";
- -#endif /* SCCSID */
- -
- -#include "rparams.h"
- -
- -/*
- - * readnews - article reading program
- - */
- -
- -#ifndef SYSBUF
- -char SYSBUF[BUFSIZ]; /* to buffer std out */
- -#endif
- -
- -#define OPTION 0 /* pick up an option string */
- -#define STRING 1 /* pick up a string of arguments */
- -
- -struct timeb Now;
- -
- -int onsig(), cleanup();
- -
- -/*
- - * Authors:
- - * Matt Glickman ucbvax!glickman
- - * Mark Horton cbosg!mark
- - * Stephen Daniels duke!swd
- - * Tom Truscott duke!trt
- - */
- -
- -main(argc, argv)
- -int argc;
- -register char **argv;
- -{
- - register char *ptr; /* pointer to rest of buffer */
- - char *user, *home;
- - int optflag = FALSE, space = FALSE;
- - struct utsname ubuf;
- - char *myrc;
- -
- - /* set up defaults and initialize. */
- - pathinit();
- - mode = UNKNOWN;
- - header.title[0] = header.nbuf[0] = '\0';
- - coptbuf[0] = datebuf[0] = '\0';
- - uname(&ubuf);
- - strcpy(FULLSYSNAME, ubuf.nodename);
- -
- - savmask = umask(N_UMASK); /* set up mask */
- - uid = getuid();
- - gid = getgid();
- - duid = 0;
- - dgid = 0;
- - (void) ftime(&Now);
- -
- -#ifndef SHELL
- - if ((SHELL = getenv("SHELL")) == NULL)
- - SHELL = "/bin/sh";
- -#endif
- -#ifndef IHCC
- - /*
- - * IHCC does not allow use of $LOGNAME to prevent forgery.
- - * Note that this shouldn't matter in readnews, since inews
- - * does all the actual posting of news.
- - */
- - if ((user = getenv("USER")) == NULL)
- - user = getenv("LOGNAME");
- - if ((home = getenv("HOME")) == NULL)
- - home = getenv("LOGDIR");
- -#endif
- - if (user == NULL || home == NULL)
- - getuser();
- - else {
- - username = AllocCpy(user);
- - (void) strcpy(header.path, username);
- - userhome = AllocCpy(home);
- - }
- -
- - if (!(MAILER = getenv("MAILER")))
- - MAILER = "mail"; /* was /bin/mail */
- -
- -#ifdef PAGE
- - if (myrc = getenv("PAGER"))
- - PAGER = AllocCpy(myrc);
- - else {
- -# ifdef IHCC
- - (void) sprintf(bfr, "%s/bin/%s", logdir(HOME), PAGE);
- - PAGER = AllocCpy(bfr);
- -# else /* !IHCC */
- - PAGER = PAGE;
- -# endif /* !IHCC */
- - }
- -#endif /* PAGE */
- -
- - if (ptr = getenv("NEWSOPTS"))
- - (void) strcpy(rcbuf, ptr);
- - else
- - *rcbuf = '\0';
- - if (*rcbuf) {
- - (void) strcat(rcbuf, " \1");
- - ptr = rcbuf;
- - while (*++ptr)
- - if (isspace(*ptr))
- - *ptr = '\0';
- - for (ptr = rcbuf; ; ptr++) {
- - if (!*ptr)
- - continue;
- - if (*ptr == '\1')
- - break;
- - if (++line > LINES)
- - xerror("Too many options.");
- - if ((rcline[line] = malloc((unsigned)(strlen(ptr) + 1))) == NULL)
- - xerror("Not enough memory.");
- - argvrc[line] = rcline[line];
- - (void) strcpy(rcline[line], ptr);
- - while (*ptr)
- - ptr++;
- - }
- - }
- - myrc = getenv("NEWSRC");
- - if (myrc == NULL) {
- - myrc = NEWSRC;
- - (void) sprintf(newsrc, "%s/%s", userhome, myrc);
- - } else {
- - (void) strcpy(newsrc, myrc);
- - }
- - if (access(newsrc, 0))
- - newrc(newsrc);
- - if ((rcfp = fopen(newsrc, "r")) != NULL) {
- - rcreadok = FALSE;
- - while (fgets(rcbuf, LBUFLEN, rcfp) != NULL) {
- - if (!(space = isspace(*rcbuf)))
- - optflag = FALSE;
- - if (!strncmp(rcbuf, "options ", 8))
- - optflag = TRUE;
- - if (optflag) {
- - (void) strcat(rcbuf, "\1");
- - if (space)
- - ptr = rcbuf - 1;
- - else
- - ptr = &rcbuf[7];
- - while (*++ptr)
- - if (isspace(*ptr))
- - *ptr = '\0';
- - if (space)
- - ptr = rcbuf;
- - else
- - ptr = &rcbuf[8];
- - for (; ; ptr++) {
- - if (!*ptr)
- - continue;
- - if (*ptr == '\1')
- - break;
- - if (++line > LINES)
- - xerror("Too many options.");
- - if ((rcline[line] = malloc((unsigned)(strlen(ptr) + 1))) == NULL)
- - xerror("Not enough memory.");
- - argvrc[line] = rcline[line];
- - (void) strcpy(rcline[line], ptr);
- - while (*ptr)
- - ptr++;
- - }
- - }
- - }
- - (void) fclose(rcfp);
- - rcreadok = TRUE;
- - }
- - if (line != -1) {
- -#ifdef DEBUG
- - register int i;
- - for (i = 0; i <= line; i++)
- - fprintf(stderr, "options: %s\n", rcline[i]);
- -#endif
- - process(line + 2, argvrc);
- - do {
- -#ifdef DEBUG
- - fprintf(stderr, "Freeing %d\n", line);
- -#endif
- - free(rcline[line]);
- - } while (line--);
- - }
- -
- - argv++;
- - (void) strcat(header.nbuf, ADMSUB);
- - process(argc, argv);
- - if (!nflag)
- - (void) sprintf(header.nbuf, "%s,%s", ADMSUB, DFLTSUB);
- - else {
- - char *p = rindex(header.nbuf, ',');
- - if (p && p[1] == '\0') /* strip of trailing NGDELIM */
- - *p ='\0';
- - }
- - lcase(header.nbuf);
- - makehimask(header.nbuf, "junk");
- - makehimask(header.nbuf, "control");
- - makehimask(header.nbuf, "test");
- -
- - setbuf(stdout, SYSBUF);
- - SigTrap = FALSE; /* true if a signal has been caught */
- - if (!pflag && !lflag && !eflag) {
- - (void) signal(SIGQUIT, SIG_IGN);
- - (void) signal(SIGHUP, cleanup);
- - (void) signal(SIGINT, onsig);
- - (void) signal(SIGPIPE, onsig);
- - } else {
- - int (* old)();
- - if ((old = signal(SIGQUIT, SIG_IGN)) != SIG_IGN)
- - (void) signal(SIGQUIT, cleanup);
- - if ((old = signal(SIGHUP, SIG_IGN)) != SIG_IGN)
- - (void) signal(SIGHUP, cleanup);
- - if ((old = signal(SIGINT, SIG_IGN)) != SIG_IGN)
- - (void) signal(SIGINT, cleanup);
- - }
- -
- - /*
- - * ALL of the command line has now been processed. (!)
- - */
- -
- - if (!*header.nbuf)
- - strcpy(header.nbuf, DFLTSUB);
- - if (sflag) {
- - printf("Subscription list: %s\n", header.nbuf);
- - xxit(0);
- - }
- - if (xflag)
- - line = -1;
- - rcfp = xfopen(newsrc, "r");
- - while (fgets(rcbuf, LBUFLEN, rcfp) != NULL) {
- - if (!nstrip(rcbuf))
- - xerror(".newsrc line too long");
- - if (++line >= LINES)
- - xerror("Too many .newsrc lines");
- - if ((rcline[line] = malloc((unsigned)(strlen(rcbuf) + 1))) == NULL)
- - xerror("Not enough memory");
- - (void) strcpy(rcline[line], rcbuf);
- - }
- - fclose(rcfp);
- -
- - if (SigTrap) {
- - if (SigTrap == SIGHUP || !rcreadok)
- - xxit(0);
- - fprintf(stdout, "Abort (n)? ");
- - (void) fflush(stdout);
- - if (gets(bfr) == NULL || *bfr == 'y' || *bfr == 'Y')
- - xxit(0);
- - SigTrap = FALSE;
- - }
- - sortactive();
- - actfp = xfopen(ACTIVE, "r");
- -
- -#ifdef DEBUG
- - fprintf(stderr, "header.nbuf = %s\n", header.nbuf);
- -#endif /* DEBUG */
- - if (Kflag)
- - news++;
- - else {
- - switch (mode) {
- - case UNKNOWN:
- - readr();
- - break;
- -#ifdef TMAIL
- - case MAIL:
- - Mail();
- - break;
- -#endif /* TMAIL */
- - }
- - }
- -
- - cleanup();
- - /*NOTREACHED*/
- -}
- -
- -cleanup()
- -{
- - (void) signal(SIGHUP, SIG_IGN);
- - (void) fflush(stdout);
- - if (!news || xflag || lflag || tflag)
- - xxit(0);
- - if (*groupdir && mode != MAIL)
- - updaterc();
- - writeoutrc();
- - xxit(0);
- -}
- -
- -/*
- - * Write out the .newsrc file. It's already been cleaned up by sortactive()
- - * Take care that data is all written, and flushed, before we destroy the
- - * old copy.
- - */
- -writeoutrc()
- -{
- - FILE *wrcfp;
- - char aline[BUFLEN];
- - register int i;
- -
- - /* NEVER write it out if xflag */
- - if (xflag || !rcreadok)
- - return;
- -
- - (void) strcpy(aline, newsrc);
- - (void) strcat(aline, ".new");
- -
- -#ifdef VMS
- - (void) vmsdelete(aline);
- -#endif
- - wrcfp = xfopen(aline, "w");
- -
- - for (i = 0; i <= line; i++) {
- - if (rcline[i] != NULL)
- - if (fprintf(wrcfp, "%s\n", rcline[i]) < 0)
- - goto fouled;
- - }
- - if (fclose(wrcfp) < 0)
- - goto fouled;
- -
- -#ifdef VMS
- - (void) vmsdelete(newsrc);
- -#endif
- - if (rename(aline, newsrc) < 0)
- - xerror("Cannot rename %s to %s", aline, newsrc);
- - return;
- -
- - fouled:
- - xerror("Error writing new .newsrc file - no changes made\n");
- - return;
- -}
- -
- -/*
- - * Forbid newsgroup ng, unless he asked for it in nbuf.
- - */
- -makehimask(nbuf, ng)
- -char *nbuf, *ng;
- -{
- - if (!findex(nbuf, ng))
- - (void) sprintf(rindex(nbuf, '\0'), ",!%s", ng);
- -}
- -
- -/*
- - * Return true if the string searchfor is in string, but not if preceded by !.
- - */
- -findex(string, searchfor)
- -char *string, *searchfor;
- -{
- - register char first;
- - register char *p;
- -
- - first = *searchfor;
- - for (p=index(string, first); p; p = index(p+1, first)) {
- - if (((p==string) || (p[-1]!='!')) && strncmp(p, searchfor, strlen(searchfor)) == 0)
- - return TRUE;
- - }
- - return FALSE;
- -}
- *-*-END-of-src/readnews.c-*-*
- echo x - src/install.sh 1>&2
- sed 's/.//' >src/install.sh <<'*-*-END-of-src/install.sh-*-*'
- -: '@(#)install.sh 1.16 10/29/86'
- -
- -if test "$#" != 6
- -then
- - echo "usage: $0 spooldir libdir bindir nuser ngroup ostype"
- - exit 1
- -fi
- -SPOOLDIR=$1
- -LIBDIR=$2
- -BINDIR=$3
- -NEWSUSR=$4
- -NEWSGRP=$5
- -OSTYPE=$6
- -
- -: Get name of local system
- -case $OSTYPE in
- - usg) SYSNAME=`uname -n`
- - if test ! -d $LIBDIR/history.d
- - then
- - mkdir $LIBDIR/history.d
- - chown $NEWSUSR $LIBDIR/history.d
- - chgrp $NEWSGRP $LIBDIR/history.d
- - fi;;
- - v7) SYSNAME=`uuname -l`
- - touch $LIBDIR/history.pag $LIBDIR/history.dir;;
- - *) echo "$0: Unknown Ostype"
- - exit 1;;
- -esac
- -
- -if test "$SYSNAME" = ""
- -then
- - echo "$0: Cannot get system name"
- - exit 1
- -fi
- -
- -: Ensure SPOOLDIR exists
- -for i in $SPOOLDIR $SPOOLDIR/.rnews
- -do
- - if test ! -d $i
- - then
- - mkdir $i
- - fi
- - chmod 777 $i
- - chown $NEWSUSR $i
- - chgrp $NEWSGRP $i
- -done
- -
- -chown $NEWSUSR $LIBDIR
- -chgrp $NEWSGRP $LIBDIR
- -
- -: Ensure certain files in LIBDIR exist
- -touch $LIBDIR/history $LIBDIR/active $LIBDIR/log $LIBDIR/errlog $LIBDIR/users
- -chmod 666 $LIBDIR/users
- -
- -: If no sys file, make one.
- -if test ! -f $LIBDIR/sys
- -then
- -echo
- -echo Making a $LIBDIR/sys file to link you to oopsvax.
- -echo You must change oopsvax to your news feed.
- -echo If you are not in the USA, remove '"usa"' from your line in the sys file.
- -echo If you are not in North America, remove '"na"' from your line in the sys file.
- - cat > $LIBDIR/sys << EOF
- -$SYSNAME:world,comp,sci,news,rec,soc,talk,misc,net,mod,na,usa,to::
- -oopsvax:world,comp,sci,news,rec,soc,talk,misc,net,mod,na,usa,to.oopsvax::
- -EOF
- -fi
- -
- -: If no seq file, make one.
- -if test ! -s $LIBDIR/seq
- -then
- - echo '100' >$LIBDIR/seq
- -fi
- -
- -: If no mailpaths, make one.
- -if test ! -s $LIBDIR/mailpaths
- -then
- - cat <<E_O_F >$LIBDIR/mailpaths
- -backbone %s
- -internet %s
- -E_O_F
- -echo "I have created $LIBDIR/mailpaths for you. The paths are certainly wrong."
- -echo "You must correct them manually to be able to post to moderated groups."
- -fi
- -
- -sh makeactive.sh $LIBDIR $SPOOLDIR $NEWSUSR $NEWSGRP
- -
- -for i in $LIBDIR/ngfile $BINDIR/inews $LIBDIR/localgroups $LIBDIR/moderators \
- - $LIBDIR/cunbatch $LIBDIR/c7unbatch
- -do
- - if test -f $i
- - then
- - echo "$i is no longer used. You should remove it."
- - fi
- -done
- -
- -for i in $LIBDIR/csendbatch $LIBDIR/c7sendbatch
- -do
- - if test -f $i
- - then
- - echo "$i is no longer used. You should remove it after"
- - echo "changing your crontab entry to use sendbatch [flags]"
- - fi
- -done
- -
- -if test -f $BINDIR/cunbatch
- -then
- - echo "$BINDIR/cunbatch is not used by the new batching scheme."
- - echo "You should remove it when all of your neighbors have upgraded."
- -fi
- -
- -cat >$LIBDIR/aliases.new <<EOF
- -net.chess net.games.chess
- -net.trivia net.games.trivia
- -net.rec.radio net.ham-radio
- -net.term net.info-terms
- -net.joke net.jokes
- -net.vlsi net.lsi
- -net.micro.16k net.micro.ns32k
- -net.music.gdea net.music.gdead
- -net.notes net.news.notes
- -net.periph net.periphs
- -net.puzzles net.puzzle
- -net.unix.wizards net.unix-wizards
- -net.sources.wanted net.wanted.sources
- -net.consumers misc.consumers
- -net.consumers.house misc.consumers.house
- -net.house misc.consumers.house
- -na.forsale misc.forsale
- -net.forsale misc.forsale
- -net.politics.terror misc.headlines
- -net.invest misc.invest
- -net.jobs misc.jobs
- -net.kids misc.kids
- -mod.legal misc.legal
- -net.legal misc.legal
- -net.followup misc.misc
- -net.general misc.misc
- -net.misc misc.misc
- -net.suicide misc.misc
- -net.taxes misc.taxes
- -mod.test misc.test
- -net.test misc.test
- -net.wanted misc.wanted
- -net.announce mod.announce
- -net.announce.newusers mod.announce.newusers
- -mod.map.uucp mod.map
- -net.religion.christian mod.religion.christian
- -net.religion.xian mod.religion.christian
- -net.astro sci.astro
- -net.astro.expert sci.astro
- -net.bio sci.bio
- -net.crypt sci.crypt
- -net.analog sci.electronics
- -net.nlang sci.lang
- -net.math sci.math
- -net.stat sci.math.stat
- -net.math.stat sci.math.stat
- -net.math.symbolic sci.math.symbolic
- -net.med sci.med
- -net.sci sci.misc
- -net.physics sci.physics
- -net.research sci.research
- -net.space sci.space
- -net.columbia sci.space.shuttle
- -net.challenger sci.space.shuttle
- -net.college soc.college
- -net.nlang.africa soc.culture.african
- -net.nlang.celts soc.culture.celtic
- -net.nlang.greek soc.culture.greek
- -net.nlang.india soc.culture.indian
- -net.religion.jewish soc.culture.jewish
- -net.social soc.misc
- -mod.motss soc.motss
- -net.motss soc.motss
- -net.net-people soc.net-people
- -net.roots soc.roots
- -net.singles soc.singles
- -net.women soc.women
- -net.abortion talk.abortion
- -net.bizarre talk.bizarre
- -net.origins talk.origins
- -net.philosophy talk.philosophy.misc
- -net.politics talk.politics.misc
- -net.politics.theory talk.politics.theory
- -net.religion talk.religion.misc
- -talk.religion talk.religion.misc
- -net.rumor talk.rumors
- -talk.rumor talk.rumors
- -EOF
- -: if no aliases file, make one
- -if test ! -f $LIBDIR/aliases
- -then
- - mv $LIBDIR/aliases.new $LIBDIR/aliases
- -else
- - : see whats missing
- - sort $LIBDIR/aliases | sed -e 's/ */ /g' -e 's/ */ /g' >/tmp/$$aliases
- - sort $LIBDIR/aliases.new | sed -e 's/ */ /g' -e 's/ */ /g' >/tmp/$$aliases.new
- - comm -23 /tmp/$$aliases.new /tmp/$$aliases >/tmp/$$comm
- - if test -s /tmp/$$comm
- - then
- - echo "The following suggested aliases are missing or incorrect in your"
- - echo "$LIBDIR/aliases file. It is suggested you add them."
- - echo ""
- - cat /tmp/$$comm
- - echo ""
- - echo "A suggested aliases file has been left in $LIBDIR/aliases.new"
- - echo "for your convenience."
- - rm /tmp/$$comm /tmp/$$aliases
- - else
- - rm /tmp/$$comm /tmp/$$aliases $LIBDIR/aliases.new
- - fi
- -fi
- -
- -: if no distributions file, make one
- -if test ! -f $LIBDIR/distributions
- -then
- - cat >$LIBDIR/distributions <<EOF
- -local Local to this site
- -regional Everywhere in this general area
- -usa Everywhere in the USA
- -na Everywhere in North America
- -world Everywhere on Usenet in the world
- -EOF
- -echo
- -echo You may want to add distributions to $LIBDIR/distributions if your
- -echo site particpates in a regional distribution such as '"ba"' or '"dc"'.
- -fi
- -
- -chown $NEWSUSR $LIBDIR/[a-z]*
- -chgrp $NEWSGRP $LIBDIR/[a-z]*
- -
- -echo
- -echo Reminder: uux must permit rnews if running over uucp.
- -rm -f /tmp/$$*
- *-*-END-of-src/install.sh-*-*
- echo x - src/batch.c 1>&2
- sed 's/.//' >src/batch.c <<'*-*-END-of-src/batch.c-*-*'
- -
- -/*
- - * This software is Copyright (c) 1985 by Rick Adams.
- - *
- - * Permission is hereby granted to copy, reproduce, redistribute or
- - * otherwise use this software as long as: there is no monetary
- - * profit gained specifically from the use or reproduction or this
- - * software, it is not sold, rented, traded or otherwise marketed, and
- - * this copyright notice is included prominently in any copy
- - * made.
- - *
- - * The author make no claims as to the fitness or correctness of
- - * this software for any use whatsoever, and it is provided as is.
- - * Any use of this software is at the user's own risk.
- - *
- - * Batch: program to batch a list of news articles into an unbatch script.
- - * Usage: /usr/lib/news/batch listfile [bytecount]
- - * where listfile is a file containing a list, one per line, of full
- - * path names of files containing articles, e.g. as produced by the F
- - * transmission option in the sys file.
- - * bytecount is the maximum number of bytes to output before exiting
- - * Output is placed on standard output.
- - *
- - * Intended usage:
- - *
- - * With the shellfile "sendbatch", with machine names as arguments:
- - * e.g
- - * sendbatch rlgvax seismo
- - *
- - * This would be invoked every hour or two from crontab.
- - *
- - */
- -
- -#ifdef SCCSID
- -static char *SccsId = "@(#)batch.c 1.15 1/17/86";
- -#endif /* SCCSID */
- -
- -#include <stdio.h>
- -#include <sys/types.h>
- -#include <sys/stat.h>
- -#include <errno.h>
- -#include "defs.h"
- -
- -#if defined(USG) || defined(BSD4_2) || defined(BSD4_1C)
- -#include <fcntl.h>
- -#endif
- -
- -struct stat sbuf;
- -
- -extern int errno;
- -extern char *sys_errlist[];
- -
- -main(argc,argv)
- -char **argv;
- -{
- - register FILE *fd, *nfd;
- - register int c;
- - register long n;
- - register char *cp;
- - char *fdstatus;
- - long maxbytes, nbytes;
- - long atol();
- - char fname[512];
- - char workfile[512];
- - char *index(), *fgets();
- -
- - if (argc < 2) {
- - fprintf(stderr, "Usage: batch listfile [bytecount]\n");
- - exit(1);
- - }
- -
- - /*
- - * Rename real file to a work name to avoid race conditions.
- - * If workfile exists skip the rename in order
- - * to recover from a crash w/o losing anything.
- - */
- - (void) strcpy(workfile, argv[1]);
- - (void) strcat(workfile, ".work");
- - if (access(workfile, 0) < 0) {
- - if (access(argv[1], 0) < 0 && errno == ENOENT)
- - exit(0); /* no news */
- - if (rename(argv[1], workfile) < 0) {
- - logerror("rename(%s,%s) %s", argv[1], workfile,
- - sys_errlist[errno]);
- - exit(1);
- - }
- - }
- - fd = fopen(workfile, "r");
- - if (fd == NULL) {
- - logerror("fopen(%s,r) %s", workfile, sys_errlist[errno]);
- - exit(1);
- - }
- -
- - if (argc > 2)
- - maxbytes = atol(argv[2]);
- - else
- - maxbytes = 100000000L; /* backwards compatible */
- - nbytes = 0;
- - while ((fdstatus = fgets(fname, sizeof fname, fd)) != NULL) {
- - cp = index(fname, '\n');
- - if (cp)
- - *cp = '\0';
- - nfd = fopen(fname, "r");
- - if (nfd == NULL) {
- - perror(fname);
- - continue;
- - }
- - (void) fstat(fileno(nfd), &sbuf);
- - if (cp)
- - *cp = '\n';
- - nbytes += sbuf.st_size;
- - if (nbytes > maxbytes && nbytes != sbuf.st_size)
- - break;
- - printf("#! rnews %ld\n", (long)sbuf.st_size);
- - /* guess length of #! rnews string */
- - nbytes += 13;
- - n = 0;
- - while ((c = getc(nfd)) != EOF) {
- - putchar(c);
- - n++;
- - }
- - (void) fclose(nfd);
- - if (ferror(stdout)){
- - logerror("stdout write %s", sys_errlist[errno]);
- - exit(1);
- - }
- - if (n != sbuf.st_size) { /* paranoia */
- - logerror("%s, expected %ld bytes, got %ld", fname,
- - n, sbuf.st_size);
- - /* breaking out of this early will end up resyncing
- - the batch files (isn't serendipity wonderful?) */
- - break;
- - }
- - }
- - if (fdstatus != NULL) { /* exceeded maxbytes */
- - char tmpfile[512];
- -
- - (void) umask(2);
- - (void) strcpy(tmpfile, argv[1]);
- - (void) strcat(tmpfile, ".tmp");
- - nfd = fopen(tmpfile, "w");
- - if (nfd == NULL) {
- - logerror("fopen(%s,w) %s", tmpfile, sys_errlist[errno]);
- - exit(1);
- - }
- - do {
- - fputs(fname, nfd);
- - } while (fgets(fname, sizeof fname, fd) != NULL);
- - if (ferror(nfd)) {
- - logerror("write(%s) %s", tmpfile, sys_errlist[errno]);
- - exit(1);
- - }
- - (void) fclose(nfd);
- - (void) fclose(fd);
- - /* will pick it up next time thru */
- - if (rename(tmpfile, workfile) < 0) {
- - logerror("rename(%s,%s) %s", tmpfile, workfile,
- - sys_errlist[errno]);
- - exit(1);
- - }
- - }
- - else
- - (void) unlink(workfile);
- - exit(0);
- -}
- -
- -/*
- - * Log the given message, with printf strings and parameters allowed,
- - * on the log file, if it can be written.
- - */
- -/* VARARGS1 */
- -logerror(fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9)
- -char *fmt;
- -{
- - FILE *logfile;
- - char lfname[BUFLEN]; /* the log file */
- - char bfr[BUFLEN];
- - char *logtime, *ctime();
- - time_t t;
- -
- - (void) time(&t);
- - logtime = ctime(&t);
- - logtime[16] = 0;
- - logtime += 4;
- -
- -#ifdef IHCC
- - (void) sprintf(lfname, "%s/%s/errlog", logdir(HOME), LIBDIR);
- -#else
- - (void) sprintf(lfname, "%s/errlog", LIBDIR);
- -#endif
- -
- - (void) sprintf(bfr, fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9);
- - fprintf(stderr, bfr);
- - if (access(lfname, 0) == 0 && (logfile = fopen(lfname, "a")) != NULL) {
- -#if defined(USG) || defined(BSD4_2) || defined(BSD4_1C)
- - int flags;
- - flags = fcntl(fileno(logfile), F_GETFL, 0);
- - (void) fcntl(fileno(logfile), F_SETFL, flags|O_APPEND);
- -#else /* v7 */
- - (void) lseek(fileno(logfile), 0L, 2);
- -#endif /* v7 */
- - fprintf(logfile, "%s\tbatch\t%s\n", logtime, bfr);
- - (void) fclose(logfile);
- - }
- -}
- -
- -#if !defined(BSD4_2) && !defined(BSD4_1C)
- -rename(from, to)
- -register char *from, *to;
- -{
- - (void) unlink(to);
- - if (link(from, to) < 0)
- - return -1;
- -
- - (void) unlink(from);
- - return 0;
- -}
- -#endif /* !BSD4_2 && !BSD4_1C */
- *-*-END-of-src/batch.c-*-*
- echo x - src/process.c 1>&2
- sed 's/.//' >src/process.c <<'*-*-END-of-src/process.c-*-*'
- -/*
- - * This software is Copyright (c) 1986 by Rick Adams.
- - *
- - * Permission is hereby granted to copy, reproduce, redistribute or
- - * otherwise use this software as long as: there is no monetary
- - * profit gained specifically from the use or reproduction or this
- - * software, it is not sold, rented, traded or otherwise marketed, and
- - * this copyright notice is included prominently in any copy
- - * made.
- - *
- - * The author make no claims as to the fitness or correctness of
- - * this software for any use whatsoever, and it is provided as is.
- - * Any use of this software is at the user's own risk.
- - *
- - * process - process options for readnews/vnews
- - */
- -
- -#ifdef SCCSID
- -static char *SccsId = "@(#)process.c 2.15 9/16/86";
- -#endif /* SCCSID */
- -
- -#include "rparams.h"
- -
- -#define OPTION 0 /* pick up an option string */
- -#define STRING 1 /* pick up a string of arguments */
- -
- -struct optable *optpt, options[] = { /*
- -optlet filchar flag newstate oldmode newmode buf */
- -'p', '\0', FALSE, OPTION, UNKNOWN, UNKNOWN,(char *)NULL,
- -'t', '\0', FALSE, STRING, ANY, UNKNOWN,header.title,
- -'a', ' ', FALSE, STRING, ANY, UNKNOWN,datebuf,
- -'n', NGDELIM, FALSE, STRING, ANY, UNKNOWN,header.nbuf,
- -'c', ' ', FALSE, STRING, UNKNOWN, UNKNOWN,coptbuf,
- -'l', ' ', FALSE, OPTION, UNKNOWN, UNKNOWN,(char *)NULL,
- -'r', '\0', FALSE, OPTION, ANY, UNKNOWN,(char *)NULL,
- -'s', NGDELIM, FALSE, STRING, ANY, UNKNOWN,header.nbuf,
- -'x', '\0', FALSE, OPTION, ANY, UNKNOWN,(char *)NULL,
- -'h', '\0', FALSE, OPTION, ANY, UNKNOWN,(char *)NULL,
- -#ifdef TMAIL
- -'M', '\0', FALSE, OPTION, UNKNOWN, MAIL, (char *)NULL,
- -#else /* !TMAIL */
- -'\377', '\0', FALSE, OPTION, UNKNOWN, UNKNOWN,(char *)NULL,
- -#endif /* !TMAIL */
- -'f', '\0', FALSE, OPTION, ANY, UNKNOWN,(char *)NULL,
- -'u', '\0', FALSE, OPTION, ANY, UNKNOWN,(char *)NULL,
- -'e', '\0', FALSE, OPTION, ANY, UNKNOWN,(char *)NULL,
- -'K', '\0', FALSE, OPTION, ANY, UNKNOWN,(char *)NULL,
- -'\0', '\0', 0, 0, 0, 0, (char *)NULL
- -};
- -
- -process(argc,argv)
- -register int argc;
- -register char **argv;
- -{
- - register int state = STRING;
- - register char *ptr = header.nbuf;
- - char filchar = NGDELIM;
- - int len = BUFLEN, tlen;
- -
- - /* loop once per arg. */
- -
- - if (argc > 1 && **argv != '-')
- - nflag = TRUE;
- -
- - while (--argc) {
- - if (state == OPTION) {
- - if (**argv != '-') {
- - xerror("Bad option string \"%s\"", *argv);
- - }
- - while (*++*argv != '\0') {
- - for (optpt = options; optpt->optlet != '\0'; ++optpt) {
- - if (optpt->optlet == **argv)
- - goto found;
- - }
- - /* unknown option letter */
- -#ifdef TMAIL
- - fprintf(stderr, "Usage: %s [ -a [ date ]] [ -n newsgroups ] [ -t titles ] [ -lprxhfuMK ]\n", Progname);
- -#else /* !TMAIL */
- - fprintf(stderr, "Usage: %s [ -a [ date ]] [ -n newsgroups ] [ -t titles ] [ -lprxhfuK ]\n", Progname);
- -#endif /* !TMAIL */
- - fprintf(stderr, "\t[ -c [ ``mailer'' ]]\n\n");
- - fprintf(stderr, " %s -s\n", Progname);
- - exit(1);
- -
- - found:;
- - if (mode != UNKNOWN && (mode&optpt->oldmode) == 0) {
- - xerror("Bad %c option", **argv);
- - }
- - if (mode == UNKNOWN)
- - mode = optpt->newmode;
- - filchar = optpt->filchar;
- - optpt->flag = TRUE;
- - state = optpt->newstate;
- - ptr = optpt->buf;
- - len = BUFLEN;
- - }
- -
- - argv++; /* done with this option arg. */
- -
- - } else {
- -
- - /*
- - * Pick up a piece of a string and put it into
- - * the appropriate buffer.
- - */
- - if (**argv == '-') {
- - state = OPTION;
- - argc++; /* uncount this arg. */
- - continue;
- - }
- -
- - if ((tlen = strlen(*argv)) >= len)
- - xerror("Argument string too long");
- - strcpy(ptr, *argv++);
- - ptr += tlen;
- - if (*(ptr-1) != filchar)
- - *ptr++ = filchar;
- - len -= tlen + 1;
- - *ptr = '\0';
- - }
- - }
- - return;
- -}
- *-*-END-of-src/process.c-*-*
- echo x - src/uurec.c 1>&2
- sed 's/.//' >src/uurec.c <<'*-*-END-of-src/uurec.c-*-*'
- -/*
- - * uurec - receive articles via /bin/mail.
- - */
- -
- -#ifdef SCCSID
- -static char *SccsId = "@(#)uurec.c 2.9 4/16/85";
- -#endif /* SCCSID */
- -
- -#include "defs.h"
- -
- -#include <stdio.h>
- -#include <ctype.h>
- -
- -/*
- - * Process a news article which has been shipped via /bin/mail.
- - */
- -
- -#define FROM 01
- -#define NLIN 02
- -#define BLANK 03
- -#define OTHER 04
- -
- -#define SKIPPING 010
- -#define READING 020
- -
- -#define BFSZ 250
- -
- -#define EOT '\004'
- -
- -#define A 01
- -#define B 02
- -
- -#ifdef debug
- -# define RNEWS "cat"
- -#endif
- -extern char *strcat(), *strcpy();
- -extern char *frombreak();
- -extern FILE *popen();
- -
- -/* ARGSUSED */
- -main(argc, argv)
- -int argc;
- -char **argv;
- -{
- - char buf[BFSZ], fbuf[BFSZ];
- - char bfr[BFSZ], *pbfr = bfr;
- - register char *p = NULL;
- - register FILE *pipe = stdout;
- - register int mode, frmflg, pathcnt, format;
- - char *index();
- -
- - mode = SKIPPING;
- - frmflg = FALSE;
- - while (fgets(buf, BFSZ, stdin) != NULL) {
- -#ifdef debug
- - printf("%o\t%s", mode|type(buf), buf);
- -#endif
- - switch (mode | type(buf)) {
- -
- - case FROM | SKIPPING:
- - if (frmflg)
- - p = frombreak(p, buf);
- - else
- - p = fbuf;
- - frmflg = TRUE;
- - break;
- -
- - case FROM | READING:
- - if (!frmflg) {
- - frmflg = TRUE;
- - p = fbuf;
- - pclose(pipe);
- - }
- - p = frombreak(p, buf);
- - break;
- -
- - case NLIN | SKIPPING:
- - if ((isupper(buf[1]) && index(buf, ':')) || !strncmp(buf, "From ", 5))
- - format = B;
- - else
- - format = A;
- -#ifdef debug
- - printf("format = %d\n", format);
- -#endif
- - mode = READING;
- -
- - case NLIN | READING:
- - if (frmflg) {
- - frmflg = FALSE;
- - --p;
- - while (p >= fbuf && *--p != '!')
- - ;
- - *++p = '\0';
- - pathcnt = 0;
- -#ifdef IHCC
- - sprintf(pbfr, "%s/%s/%s", logdir(HOME),
- - LIBDIR, "rnews");
- -#else
- - pbfr = RNEWS;
- -#endif
- - if ((pipe = popen(pbfr, "w")) == NULL) {
- - perror("uurec: popen failed");
- - exit(1);
- - }
- - }
- - if (format == A) {
- - if (++pathcnt == 3)
- - fputs(fbuf, pipe);
- - fputs(buf+1, pipe);
- - } else {
- - if (!pathcnt && (!strncmp(buf+1, "From: ", 6) || !strncmp(buf+1, "From ", 5))) {
- - pathcnt++;
- - fprintf(pipe, "From: %s", fbuf);
- - sscanf(buf, "%s %[^\n]", fbuf, fbuf);
- - fprintf(pipe, "%s\n", fbuf);
- - } else
- - fputs(buf+1, pipe);
- - }
- - break;
- -
- - case OTHER | SKIPPING:
- - break;
- -
- - case OTHER | READING:
- - pclose(pipe);
- - mode = SKIPPING;
- - }
- - }
- - if (pipe)
- - pclose(pipe);
- - exit(0);
- -}
- -
- -type(p)
- -register char *p;
- -{
- - while (*p == ' ' || *p == '?')
- - ++p;
- -
- - if (*p == 'N')
- - return (NLIN);
- -
- - if (strncmp(p, ">From ", 6) == 0)
- - return (FROM);
- -
- - if (strncmp(p, "From ", 5) == 0)
- - return (FROM);
- -
- - return(OTHER);
- -}
- -
- -/*
- - * Get the system name out of a from line.
- - */
- -char *
- -frombreak(buf, fbuf)
- -register char *buf, *fbuf;
- -{
- - register char *p;
- -
- - /* break the line into tokens. */
- - p = fbuf;
- - while (*++p != '\0')
- - switch (*p) {
- - case '\n':
- - case '\t':
- - case ' ':
- - *p = '\0';
- - break;
- - case EOT:
- - goto garbled;
- - default:;
- - }
- - *++p = EOT;
- - *++p = '\0';
- -
- - for (p=fbuf; *p != EOT || p[1] != '\0'; p += strlen(p)+1) {
- - if (strcmp(p, "forwarded") == 0)
- - return(buf);
- - if (strcmp(p, "remote") == 0) {
- - p += strlen(p)+1;
- - if (strcmp(p, "from") == 0) {
- - p += strlen(p)+1;
- - strcpy(buf, p);
- - strcat(buf, "!");
- - return(buf+strlen(buf));
- - }
- - }
- - }
- - garbled:
- - strcat(buf, "???!");
- - return(buf+4);
- -}
- *-*-END-of-src/uurec.c-*-*
- echo x - src/checkgroups.sh 1>&2
- sed 's/.//' >src/checkgroups.sh <<'*-*-END-of-src/checkgroups.sh-*-*'
- -: check active file for missing or extra newsgroups
- -: '@(#)checkgroups 1.17 10/29/86'
- -
- -if test ! -s LIBDIR/newsgroups
- -then
- - cp /dev/null LIBDIR/newsgroups
- -fi
- -# Read first line of stdin. If of the form "-n group", then only check
- -# for the specified group. Otherwise, assume doing standard groups
- -sed -e '/^[a-zA-Z-]*: /d' -e '/^$/d' -e '/^[#:]/d' | (
- -read line
- -case "${line}" in
- --n*)
- - # Doing specific group. extract group name and preserve
- - # all of current newsgroups file except for that group.
- - # Then append entries for this group.
- - group=`echo "${line}" | sed -e 's/-n /^/' -e 's/$/\\\\./'`
- - egrep -v "${group}" LIBDIR/newsgroups > /tmp/$$a
- - cat /tmp/$$a - > LIBDIR/newsgroups
- - ;;
- -*)
- - group="^net\\.|^mod\\.|^comp\\.|^sci\\.|^rec\\.|^news\\.|^soc\\.|^misc\\.|^talk\\."
- - egrep -v "${group}" LIBDIR/newsgroups > /tmp/$$a
- - cat /tmp/$$a > LIBDIR/newsgroups
- - cat >> LIBDIR/newsgroups
- - ;;
- -esac
- -
- -egrep "${group}" LIBDIR/active | sed 's/ .*//' | sort >/tmp/$$active
- -egrep "${group}" LIBDIR/newsgroups | sed 's/ .*//' | sort >/tmp/$$newsgroups
- -
- -comm -13 /tmp/$$active /tmp/$$newsgroups >/tmp/$$missing
- -comm -23 /tmp/$$active /tmp/$$newsgroups >/tmp/$$remove
- -
- -egrep "${group}" LIBDIR/active | sed -n "/m\$/s/ .*//p" |
- - sort > /tmp/$$active.mod.all
- -egrep "${group}" LIBDIR/newsgroups |
- -sed -n "/Moderated/s/[ ][ ]*.*//p" | sort > /tmp/$$newsg.mod
- -
- -comm -12 /tmp/$$missing /tmp/$$newsg.mod >/tmp/$$add.mod
- -comm -23 /tmp/$$missing /tmp/$$newsg.mod >/tmp/$$add.unmod
- -cat /tmp/$$add.mod /tmp/$$add.unmod >>/tmp/$$add
- -
- -comm -23 /tmp/$$active.mod.all /tmp/$$remove >/tmp/$$active.mod
- -comm -13 /tmp/$$newsg.mod /tmp/$$active.mod >/tmp/$$ismod
- -comm -23 /tmp/$$newsg.mod /tmp/$$active.mod >/tmp/$$notmod.all
- -comm -23 /tmp/$$notmod.all /tmp/$$add >/tmp/$$notmod
- -
- -if test -s /tmp/$$remove
- -then
- - (
- - echo "The following newsgroups are not valid and should be removed."
- - sed "s/^/ /" /tmp/$$remove
- - echo ""
- - echo "You can do this by executing the command:"
- - echo \ LIBDIR/rmgroup `cat /tmp/$$remove`
- - echo ""
- - ) 2>&1 >/tmp/$$out
- -fi
- -
- -if test -s /tmp/$$add
- -then
- - (
- - echo "The following newsgroups were missing and should be added."
- - sed "s/^/ /" /tmp/$$add
- - echo ""
- - echo "You can do this by executing the command(s):"
- - for i in `cat /tmp/$$add.unmod`
- - do
- - echo 'LIBDIR/inews -C '$i' </dev/null'
- - done
- - for i in `cat /tmp/$$add.mod`
- - do
- - echo 'LIBDIR/inews -C '$i' moderated </dev/null'
- - done
- - echo ""
- - ) 2>&1 >>/tmp/$$out
- -fi
- -
- -if test -s /tmp/$$ismod
- -then
- - (
- - echo "The following newsgroups are not moderated and are marked moderated."
- - sed "s/^/ /" /tmp/$$ismod
- - echo ""
- - echo "You can correct this by executing the command(s):"
- - for i in `cat /tmp/$$ismod`
- - do
- - echo 'LIBDIR/inews -C '$i' </dev/null'
- - done
- - echo ""
- - ) 2>&1 >>/tmp/$$out
- -fi
- -
- -if test -s /tmp/$$notmod
- -then
- - (
- - echo "The following newsgroups are moderated and not marked so."
- - sed "s/^/ /" /tmp/$$notmod
- - echo ""
- - echo "You can correct this by executing the command(s):"
- - for i in `cat /tmp/$$notmod`
- - do
- - echo 'LIBDIR/inews -C '$i' moderated </dev/null'
- - done
- - echo ""
- - ) 2>&1 >>/tmp/$$out
- -fi
- -
- -if test -s /tmp/$$out
- -then
- - (echo "Subject: Problems with your active file"
- - echo ""
- - cat /tmp/$$out
- - ) | if test $# -gt 0
- - then
- - mail $1
- - else
- - cat
- - fi
- -fi
- -)
- -
- -rm -f /tmp/$$*
- *-*-END-of-src/checkgroups.sh-*-*
- echo x - src/encode.c 1>&2
- sed 's/.//' >src/encode.c <<'*-*-END-of-src/encode.c-*-*'
- -#include <stdio.h>
- -
- -#ifdef SCCSID
- -static char *SccsId = "@(#)encode.c 1.3 5/15/85";
- -#endif /* SCCSID */
- -
- -/*
- - * Produce a 7 bit printable encoding of stdin on stdout.
- - *
- - * Encoding uses acsii chars from ' ' .. 'z'
- - * (040 .. 0172) (0x20 - 0x7a) inclusive
- - *
- - * Method is to expand 3 chars -> 4 6 bit ones.
- - * Then collect 13 6 bit chars, and spread the 13th over
- - * the preceding 12, so that each of the 12 chars is now
- - * 6.5 bits. These 2 6.5 bit chars are a little hard
- - * to represent on most common machines (one of these days
- - * sane hosts will have 1/2 bits just for this program)
- - * so we take a pair of them, and represent that in 13 bits.
- - * 13 bits (max value 8191) can be represented as
- - * A * 91 + B
- - * where A < 91, B < 91 (91^2 == 8281, so it fits!)
- - *
- - * Each of A and B is encoded as a character by adding 32
- - * to make it printable (ie: 0x20).
- - *
- - * The termination conditions are foul beyond belief. Don't
- - * monkey with them!
- - *
- - * If you think its a fluke that 040 .. 0171 just happen to
- - * be the chars that Piet Beertema's uucp 'f' protocol transmits
- - * as single bytes, you're insane. 0172 chars are produced
- - * with lower frequency than any other (given random data)
- - * so the doubling that occurs with that we will just suffer.
- - * (A newer 'f' proto, sometime, will probably not use 0172)
- - */
- -
- -/*
- - * the following pair of characters cannot legally occur
- - * in normal output (since 90*91 + 90 == 8280, which > 2^13)
- - * so we use them to indicate that the data that follows is the
- - * terminator. The character immediately following this
- - * pair is the length of the (expanded) terminator (which
- - * otherwise might be indeterminable)
- - */
- -#define ENDMARK1 ((90*91 + 90) / 91 + ' ')
- -#define ENDMARK2 ((90*91 + 90) % 91 + ' ')
- -
- -main()
- -{
- - register char *p;
- - register char *e;
- - register c;
- - char b3[3];
- -
- - p = b3;
- - e = b3 + 3;
- - while ((c = getchar()) != EOF) {
- - *p++ = c;
- - if (p == e) {
- - encode(b3, 3);
- - p = b3;
- - }
- - }
- - encode(b3, p - b3);
- - flushout();
- - exit(0);
- -}
- -
- -static char b13[13];
- -static int cnt = 0;
- -
- -encode(c, n)
- - register char *c;
- - int n;
- -{
- - register char *p;
- - register i = cnt;
- - register j;
- - char b4[4];
- -
- - p = b4;
- -
- - p[0] = (c[0] >> 2) & 0x3f;
- - p[1] = ((c[0] & 0x3) << 4) | ((c[1] >> 4) & 0xf);
- - p[2] = ((c[1] & 0xF) << 2) | ((c[2] >> 6) & 0x3);
- - if (n == 3)
- - p[3] = c[2] & 0x3f;
- - else
- - p[3] = n;
- -
- - c = &b13[i];
- - for (j = 4; --j >= 0; i++) {
- - if (i == 13) {
- - dumpcode(b13, 13);
- - c = b13;
- - i = 0;
- - }
- - *c++ = *p++;
- - }
- - cnt = i;
- -}
- -
- -flushout()
- -{
- - putchar(ENDMARK1);
- - putchar(ENDMARK2);
- - putchar(cnt + ' ');
- - dumpcode(b13, cnt);
- -}
- -
- -dumpcode(p, n)
- - register char *p;
- - register int n;
- -{
- - register last;
- - register c;
- -
- - if (n == 13)
- - n--, last = p[12];
- - else if (n & 1)
- - last = (1 << (6-1));
- - else
- - last = 0;
- -
- - for ( ; n > 0; n -= 2) {
- - c = *p++ << 6;
- - c |= *p++;
- - if (last & (1 << (6-1)))
- - c |= (1 << 12);
- - last <<= 1;
- -
- - /*
- - * note: 91^2 > 2^13, 90^2 < 2^13, (91 + ' ') is printable
- - */
- -
- - /* oh for a compiler that would only do one division... */
- - putchar((c / 91) + ' ');
- - putchar((c % 91) + ' ');
- - }
- -}
- *-*-END-of-src/encode.c-*-*
- echo x - src/caesar.c 1>&2
- sed 's/.//' >src/caesar.c <<'*-*-END-of-src/caesar.c-*-*'
- -/*
- - * program to to decrypt caesar(tm) cypher
- - * (caesar is a trademark of the roman empire)
- - *
- - * to compile:
- - *
- - * cc decrypt.c -lm -o decrypt.c
- - *
- - * usage:
- - *
- - * decrypt [n] < file
- - *
- - * where n is an optional forced rotation.
- - *
- - * authors: Stan King, John Eldridge, based on algorithm suggested by
- - * Bob Morris
- - * 29-Sep-82
- - *
- - */
- -
- -#ifdef SCCSID
- -static char *SccsId = "@(#)caesar.c 1.7 4/16/85";
- -#endif /* SCCSID */
- -
- -#include <stdio.h>
- -#include <ctype.h>
- -#include <math.h>
- -extern char *calloc();
- -
- -main(argc, argv)
- -int argc;
- -char *argv[];
- -{
- - /* letter frequencies (taken from some unix(tm) documentation) */
- - /* (unix is a trademark of Bell Laboratories) */
- - static double stdf[ 26 ] =
- - {
- - 7.97, 1.35, 3.61, 4.78, 12.37, 2.01, 1.46, 4.49,
- - 6.39, 0.04, 0.42, 3.81, 2.69, 5.92, 6.96, 2.91,
- - 0.08, 6.63, 8.77, 9.68, 2.62, 0.81, 1.88, 0.23,
- - 2.07, 0.06,
- - };
- - int obs[26];
- - int bufsize;
- - int c, i, try;
- - double dot, winnerdot; /* .. */
- - int winner, forced = 0;
- - char *inbuf;
- -
- - bufsize = 0;
- - if( argc > 1 )
- - sscanf( argv[1], "%d", &forced );
- - if( forced == 0 )
- - forced = -1000;
- -
- - inbuf = calloc( BUFSIZ, 1 );
- -
- - /* adjust frequency table to weight low probs REAL low */
- - for (i=0; i<26; i++) {
- - stdf[i] = log(stdf[i]) + log(26.0/100.0);
- - }
- -
- - /* Decode each line separately */
- - for (;;) {
- - for (i=0; i<=25; obs[i++]=0)
- - ;
- -
- - /* get a sample of the text */
- - for( i = 0; i < BUFSIZ; i++ ) {
- - if( (c = getchar()) == EOF ) {
- - exit(0);
- - }
- - inbuf[i] = c;
- - if (c == '\n') {
- - bufsize = i+1;
- - break;
- - }
- - if (islower(c))
- - obs[c-'a'] += 1;
- - else if (isupper(c))
- - obs[c-'A'] += 1;
- - }
- -
- - /* now "dot" the freqs with the observed letter freqs */
- - /* and keep track of best fit */
- - winner = 0;
- - for (try = 0; try<26; try+=13) {
- - dot = 0;
- - for ( i=0; i<26; i++ ) {
- - dot += obs[i] * stdf[ (i+try) % 26 ];
- - }
- - /* initialize winning score */
- - if( try == 0 )
- - winnerdot = dot;
- - if( dot > winnerdot ) {
- - /* got a new winner! */
- - winner = try;
- - winnerdot = dot;
- - }
- - }
- -
- - if (forced != -1000)
- - winner = forced;
- -
- - /* print out sample buffer */
- - for( i = 0; i < bufsize; i++ )
- - putchar( rotate( inbuf[i], winner ) );
- - }
- - }
- -
- -
- -static int
- -rotate( c, perm )
- -char c;
- -int perm;
- -{
- - if (isupper(c)) {
- - return 'A' + (c - 'A' + perm) % 26 ;
- - }
- - else if (islower(c)) {
- - return 'a' + (c-'a'+perm) % 26 ;
- - }
- - else return c;
- -}
- *-*-END-of-src/caesar.c-*-*
- echo x - src/defs.dist 1>&2
- sed 's/.//' >src/defs.dist <<'*-*-END-of-src/defs.dist-*-*'
- -/*
- - * This software is Copyright (c) 1986 by Rick Adams.
- - *
- - * Permission is hereby granted to copy, reproduce, redistribute or
- - * otherwise use this software as long as: there is no monetary
- - * profit gained specifically from the use or reproduction or this
- - * software, it is not sold, rented, traded or otherwise marketed, and
- - * this copyright notice is included prominently in any copy
- - * made.
- - *
- - * The author make no claims as to the fitness or correctness of
- - * this software for any use whatsoever, and it is provided as is.
- - * Any use of this software is at the user's own risk.
- - *
- - */
- -
- -/* @(#)defs.dist 2.55 10/30/86 */
- -
- -/*
- - * defs.h - defines for news-related programs.
- - *
- - * If you remove any lines here or in your Makefile, make the change
- - * to localize.sh so you won't have to redo it for each news release.
- - *
- - * If TMAIL is undefined, the -M option will be disabled.
- - *
- - * By convention, the version of the software you are running is taken
- - * to be news_version below.
- - */
- -
- -#define NEWS_VERSION "B 2.11 10/30/86"
- -
- -#define DAYS (60L*60L*24L)
- -#define WEEKS (7*DAYS)
- -/* Things that very well may require local configuration */
- -#ifndef HOME
- -#define ROOTID 10 /* uid of person allowed to cancel anything */
- -#endif
- -#define N_UMASK 000 /* mask for umask call, 022 for secure system */
- -#define DFLTEXP 2*WEEKS /* default no. of seconds to expire in */
- -#define HISTEXP 4*WEEKS /* default no. of seconds to forget in */
- -#define DFLTSUB "general,all.announce" /* default subscription list */
- -#define TMAIL "/usr/ucb/Mail" /* Mail program that understands -T */
- -#define ADMSUB "general,all.announce" /* Mandatory subscription list */
- -#define PAGE "/usr/ucb/more" /* Default pager */
- -#define NOTIFY "usenet" /* Tell him about certain ctl messages */
- - /* Default xmit command - remove -z if */
- -#define DFTXMIT "uux - -r -z %s!rnews < %s" /* your uux can't do it */
- -#define UXMIT "uux -r -z -c %s!rnews '<' %s" /* If uux -c is ok */
- -#define DFTEDITOR "vi" /* Default editor, see also postnews. */
- -/* #define UUPROG "euuname" /* omit for uuname, put in LIBDIR */
- -#define MANUALLY /* Don't execute rmgroups, just notify. */
- -/* #define NONEWGROUPS /* Don't create new groups, just notify.*/
- -#define BATCH "unbatch" /* name of unbatcher */
- -/* #define SPOOLNEWS /* Spool incoming news, don't process */
- -/* #define LOCALNAME /* There is no full name database. */
- -/* #define INTERNET /* Internet mail works locally */
- -#define MYDOMAIN ".UUCP" /* Local domain */
- -/* #define CHEAP /* don't chown files to news */
- -/* #define OLD /* Add extra headers for old neighbors */
- -/* #define UNAME /* If uname call returns your nodename */
- -/* #define GHNAME /* If gethostname call is available. */
- -/* #define UUNAME "/etc/uucpname" /* If your nodename is stored in a file */
- -#define V7MAIL /* Local mail format is V7 ("From ") */
- -#define SORTACTIVE /* if you want news presented in the order of the .newsrc */
- -#define ZAPNOTES /* if you want old style notes headers moved into the headers */
- -#define DIGPAGE /* allow digestifying in vnews */
- -/* #define DOXREFS /* Generate xref line for rn to use */
- -/* #define MULTICAST /* If you want to be able to multicast news */
- -/* #define BSD4_2 /* If you are running 4.2 or 4.3 BSD */
- -/* #define BSD4_1C /* If you are running 4.1C BSD */
- -/* #define LOCKF /* If you have the lockf() sys call */
- -/* #define ALWAYSALIAS /* temporary kludge for conversion */
- -/* #define SENDMAIL "/usr/lib/sendmail" /* command line to run "sendmail" if you have it */
- -/* #define MMDF "/usr/mmdf/submit" /* command line to run mmdf if you have it */
- -#define MYORG "Frobozz Inc., St. Louis" /* My organization. Please */
- - /* include your city (and state, and */
- - /* country, if not obvious) in MYORG, */
- - /* and please keep it short. */
- -/* #define HIDDENNET "frooz" /* if you have a local network and want */
- - /* The mail address to look like it came */
- - /* from one machine */
- -/* #define NICENESS 4 /* does a nice(NICENESS) in rnews */
- -/* #define FASCIST "all,!all.all" /* only permit posting to certain groups */
- - /* see installation guide for details */
- -/* #define SMALL_ADDRESS_SPACE /* If your machine can't address > 32767 */
- -/* #define ORGDISTRIB "froozum" /* For organization wide control message handling */
- -
- -/* Things you might want to change */
- -#define NEWSRC ".newsrc" /* name of .newsrc file (in home dir) */
- -#define LINES 512 /* maximum no. of lines in .newsrc */
- -#define NEGCHAR '!' /* newsgroup negation character */
- -#define DEADTIME 45 /* no. of seconds to wait on deadlock */
- -#define FMETA '%' /* file meta-character for c option */
- -#if defined(pdp11) || defined(SMALL_ADDRESS_SPACE)
- -# define BUFLEN 128 /* standard buffer size */
- -#else
- -# define BUFLEN 256 /* standard buffer size */
- -#endif
- -#define LBUFLEN 1024 /* big buffer size */
- -#define SBUFLEN 32 /* small buffer size (for system names, etc) */
- -#define LNCNT 14 /* Articles with > LNCNT lines go through pager */
- -
- -/* Things you probably won't want to change */
- -#define PATHLEN 512 /* length of longest source string */
- -#define DATELEN 64 /* length of longest allowed date string */
- -#define NAMELEN 128 /* length of longest possible message ID */
- -#define SNLN 8 /* max significant characters in sysname */
- -#define PROTO 'A' /* old protocol name */
- -#define NETCHRS "!:@^%,"/* Punct. chars used for various networks */
- -#define TRUE 1 /* boolean true */
- -#define FALSE 0 /* boolean false */
- -#define PERHAPS 2 /* indeterminate boolean value */
- -#define NGDELIM ',' /* delimit character in news group line */
- *-*-END-of-src/defs.dist-*-*
- exit
-
-